Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Eulerkreisproblem</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Eulerkreisproblem"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Eulerkreisproblem rootpage-Eulerkreisproblem skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Eulerkreisproblem</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr">
<p>Ein <b>Eulerkreis</b> (auch geschlossener <b>Eulerzug</b>, <b>Eulertour</b>) ist in der <a href="Graphentheorie" title="Graphentheorie">Graphentheorie</a> ein <a href="Zyklus_(Graphentheorie)" title="Zyklus (Graphentheorie)">Zyklus</a>, der alle <a href="Kante_(Graphentheorie)" title="Kante (Graphentheorie)">Kanten</a> eines <a href="Graph_(Graphentheorie)" title="Graph (Graphentheorie)">Graphen</a> genau einmal enthält.
</p><p>Ein <i>offener Eulerzug</i> (auch <i>Eulerpfad</i> oder <i>Eulerweg</i>) ist gegeben, wenn Start- und Endknoten nicht gleich sein müssen, wenn also statt eines <a href="Zyklus_(Graphentheorie)" title="Zyklus (Graphentheorie)">Zyklus</a> lediglich eine <a href="Weg_(Graphentheorie)" title="Weg (Graphentheorie)">Kantenfolge</a> verlangt wird, welche jede Kante des Graphen genau einmal enthält. Ein bekanntes Beispiel ist das „<a href="#Das_Haus_vom_Nikolaus">Haus vom Nikolaus</a>“.
</p><p>Ein <a href="Zusammenh%C3%A4ngender_Graph" class="mw-redirect" title="Zusammenhängender Graph">zusammenhängender Graph</a>, der einen <i>Eulerkreis</i> besitzt, heißt <i>eulerscher Graph</i>. Enthält ein Graph lediglich einen Eulerweg und keinen Eulerkreis, so heißt er <i>semi-eulerscher Graph</i>. Die Aufgabe, zu einem gegebenen Graph zu bestimmen, ob dieser eulersch ist oder nicht, wird als <b>Eulerkreisproblem</b> bezeichnet. Es geht auf das 1736 von <a href="Leonhard_Euler" title="Leonhard Euler">Leonhard Euler</a> gelöste <a href="K%C3%B6nigsberger_Br%C3%BCckenproblem" title="Königsberger Brückenproblem">Königsberger Brückenproblem</a> zurück. Das Problem existiert auch für <a href="Gerichteter_Graph" title="Gerichteter Graph">gerichtete Graphen</a> und <a href="Graph_mit_Mehrfachkanten" class="mw-redirect" title="Graph mit Mehrfachkanten">Graphen mit Mehrfachkanten</a>.
</p><p>Entgegen seinem Namen ist der Eulerkreis kein <a href="Kreis_(Graphentheorie)" class="mw-redirect" title="Kreis (Graphentheorie)">Kreis</a>, zumindest wenn der häufigen Definition gefolgt wird, nach der sich in einem Kreis kein <a href="Knoten_(Graphentheorie)" title="Knoten (Graphentheorie)">Knoten</a> wiederholen darf.
</p>

<div class="mw-heading mw-heading2"><h2 id="Geschichte">Geschichte</h2></div>
<p>Leonhard Euler fragte in seiner Arbeit 1736 zum Königsberger Brückenproblem – übersetzt in die heutige Fachsprache –, ob der durch die <a href="Pregel" title="Pregel">Pregelbrücken</a> der Stadt gegebene Graph ein semi-eulerscher Graph ist, das heißt, ob ein Eulerweg existiert, und verneinte dies, da der Graph mehr als zwei Knoten mit ungeradem Grad hatte. Euler bewies, dass ein semi-eulerscher Graph höchstens zwei Knoten ungeraden <a href="Grad_(Graphentheorie)" title="Grad (Graphentheorie)">Grades</a> haben kann.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> Er vermutete und gab ohne Beweis an, dass dies eine hinreichende Bedingung sei: Ein zusammenhängender Graph, in dem jeder Knoten geraden Grad hat, ist ein Eulergraph. Ein Beweis des Satzes wurde zuerst von <a href="Carl_Hierholzer" title="Carl Hierholzer">Carl Hierholzer</a> 1873 veröffentlicht.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> Auf dem Beweis basiert der <a href="Algorithmus_von_Hierholzer" title="Algorithmus von Hierholzer">Algorithmus von Hierholzer</a> zum Auffinden eines Eulerwegs.
</p>
<div class="mw-heading mw-heading2"><h2 id="Charakterisierung">Charakterisierung</h2></div>
<p>Nach dem Satz von Euler-Hierholzer sind eulersche Graphen leicht zu charakterisieren.
</p><p>Sei <i>G</i> ein Graph, bei dem höchstens eine Zusammenhangskomponente Kanten enthält. Dann sind folgende Aussagen äquivalent:
</p>
<ol><li><i>G</i> ist eulersch,</li>
<li>jeder Knoten in <i>G</i> hat <a href="Parit%C3%A4t_(Mathematik)" title="Parität (Mathematik)">geraden</a> Grad.</li>
<li>die Kantenmenge von <i>G</i> ist die <a href="Vereinigungsmenge" class="mw-redirect" title="Vereinigungsmenge">Vereinigungsmenge</a> aller Kanten von <a href="Paarweise_disjunkt" class="mw-redirect" title="Paarweise disjunkt">paarweise disjunkten</a> Kreisen.</li></ol>
<p>Analog sind für einen <a href="Gerichteter_Graph" title="Gerichteter Graph">gerichteten Graphen</a> <i>G</i>, bei dem höchstens eine <a href="Zusammenhang_(Graphentheorie)#Gerichtete_Graphen" title="Zusammenhang (Graphentheorie)">starke Zusammenhangskomponente</a> Kanten enthält, folgende Aussagen äquivalent:
</p>
<ol><li><i>G</i> ist eulersch,</li>
<li>für jeden Knoten in <i>G</i> sind <a href="Eingangsgrad" class="mw-redirect" title="Eingangsgrad">Eingangsgrad</a> und <a href="Ausgangsgrad" class="mw-redirect" title="Ausgangsgrad">Ausgangsgrad</a> gleich.</li>
<li>die Kantenmenge von <i>G</i> ist die <a href="Vereinigungsmenge" class="mw-redirect" title="Vereinigungsmenge">Vereinigungsmenge</a> aller Kanten von paarweise disjunkten <a href="Gerichteter_Kreis" class="mw-redirect" title="Gerichteter Kreis">gerichteten Kreisen</a>.</li></ol>
<div class="mw-heading mw-heading2"><h2 id="Verallgemeinerung:_Eulerweg">Verallgemeinerung: Eulerweg</h2></div>
<p>Ein <a href="Ungerichteter_Graph" class="mw-redirect" title="Ungerichteter Graph">ungerichteter</a> <a href="Zusammenh%C3%A4ngender_Graph" class="mw-redirect" title="Zusammenhängender Graph">zusammenhängender Graph</a> enthält <a href="Genau_dann%2C_wenn" class="mw-redirect" title="Genau dann, wenn">genau dann</a> einen Eulerweg, wenn zwei oder keiner seiner Knoten von ungeradem Grad sind. Hat <i>kein</i> Knoten einen ungeraden Grad, handelt es sich bei jedem Eulerweg um einen Eulerkreis.
</p>
<div class="mw-heading mw-heading2"><h2 id="Entscheidungsproblem">Entscheidungsproblem</h2></div>
<p>Die Frage, ob für einen gegebenen Graph ein Eulerkreis existiert, lässt sich algorithmisch relativ leicht lösen, da ein Graph genau dann eulersch ist, wenn er <a href="Zusammenh%C3%A4ngender_Graph" class="mw-redirect" title="Zusammenhängender Graph">zusammenhängend</a> ist und jeder Knoten geraden Grad besitzt. Mittels <a href="Tiefensuche" title="Tiefensuche">Tiefensuche</a> lässt sich dies leicht in linearer Zeit feststellen.
</p>
<div class="mw-heading mw-heading2"><h2 id="Auffinden_eines_Eulerkreises">Auffinden eines Eulerkreises</h2></div>
<p>Zum Auffinden eines Eulerkreises existieren mehrere Verfahren. Der Algorithmus von Fleury stammt aus dem Jahr 1883 und verfolgt einen sehr einfachen Ansatz, weshalb er eine <a href="Laufzeit_(Informatik)" title="Laufzeit (Informatik)">Laufzeit</a> von der Größenordnung <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\mathcal {O}}(|E|^{2})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mi class="MJX-tex-caligraphic" mathvariant="script">O</mi>
</mrow>
</mrow>
<mo stretchy="false">(</mo>
<mrow class="MJX-TeXAtom-ORD">
<mo stretchy="false">|</mo>
</mrow>
<mi>E</mi>
<msup>
<mrow class="MJX-TeXAtom-ORD">
<mo stretchy="false">|</mo>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\mathcal {O}}(|E|^{2})}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/af06b6a1c146f14ab500cc06e27b47eb0e5d3594.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:7.783ex; height:3.343ex;" alt="{\displaystyle {\mathcal {O}}(|E|^{2})}" loading="lazy"></span> hat.
</p><p>Effizienter ist der <a href="Algorithmus_von_Hierholzer" title="Algorithmus von Hierholzer">Algorithmus von Hierholzer</a>, der einen Eulerkreis in Linearzeit berechnet.
</p>
<div class="mw-heading mw-heading3"><h3 id="Algorithmus_von_Fleury">Algorithmus von Fleury</h3></div>
<p>Im Algorithmus von Fleury spielen Brückenkanten eine wichtige Rolle. Das sind Kanten, ohne die der Graph in zwei Komponenten zerfallen würde.
</p><p>Der Algorithmus fügt einer anfangs leeren Kantenfolge alle Kanten eines Graphen hinzu, sodass ein Eulerkreis entsteht.
</p>
<ol><li>Wähle einen beliebigen Knoten als aktuellen Knoten.</li>
<li>Wähle unter den unmarkierten, mit dem aktuellen Knoten inzidenten Kanten eine beliebige Kante aus. Dabei sind zuerst Kanten zu wählen, die im unmarkierten Graphen keine Brückenkanten sind.</li>
<li>Markiere die gewählte Kante und füge sie der Kantenfolge hinzu.</li>
<li>Wähle den anderen Knoten der gewählten Kante als neuen aktuellen Knoten.</li>
<li>Wenn noch unmarkierte Kanten existieren, dann gehe zu Schritt 2.</li></ol>
<p>Ob eine Kante eine Brückenkante ist, kann mittels <a href="Tiefensuche" title="Tiefensuche">Tiefensuche</a> in Laufzeit <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\mathcal {O}}(|E|)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mi class="MJX-tex-caligraphic" mathvariant="script">O</mi>
</mrow>
</mrow>
<mo stretchy="false">(</mo>
<mrow class="MJX-TeXAtom-ORD">
<mo stretchy="false">|</mo>
</mrow>
<mi>E</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo stretchy="false">|</mo>
</mrow>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\mathcal {O}}(|E|)}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/969a8859cbc34a826fcf95b2224e73dad27bee4e.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:6.729ex; height:2.843ex;" alt="{\displaystyle {\mathcal {O}}(|E|)}" loading="lazy"></span> überprüft werden. Da pro Schritt eine Kante entfernt wird, werden <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left|E\right|}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<mo>|</mo>
<mi>E</mi>
<mo>|</mo>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \left|E\right|}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/7b8281fbfd0b61f0eb5f2f877bffe92f02cc732d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:3.069ex; height:2.843ex;" alt="{\displaystyle \left|E\right|}" loading="lazy"></span> Iterationen benötigt. Die Anzahl der pro Iteration geprüften Kanten entspricht dem Grad des aktuellen Knotens. Insgesamt kann die gesamte Anzahl überprüfter Kanten durch <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\mathcal {O}}(|E|)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mi class="MJX-tex-caligraphic" mathvariant="script">O</mi>
</mrow>
</mrow>
<mo stretchy="false">(</mo>
<mrow class="MJX-TeXAtom-ORD">
<mo stretchy="false">|</mo>
</mrow>
<mi>E</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo stretchy="false">|</mo>
</mrow>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\mathcal {O}}(|E|)}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/969a8859cbc34a826fcf95b2224e73dad27bee4e.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:6.729ex; height:2.843ex;" alt="{\displaystyle {\mathcal {O}}(|E|)}" loading="lazy"></span> beschränkt werden. Die gesamte Laufzeit ist damit von der Größenordnung <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\mathcal {O}}(|E|^{2})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mi class="MJX-tex-caligraphic" mathvariant="script">O</mi>
</mrow>
</mrow>
<mo stretchy="false">(</mo>
<mrow class="MJX-TeXAtom-ORD">
<mo stretchy="false">|</mo>
</mrow>
<mi>E</mi>
<msup>
<mrow class="MJX-TeXAtom-ORD">
<mo stretchy="false">|</mo>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\mathcal {O}}(|E|^{2})}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/af06b6a1c146f14ab500cc06e27b47eb0e5d3594.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:7.783ex; height:3.343ex;" alt="{\displaystyle {\mathcal {O}}(|E|^{2})}" loading="lazy"></span>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Programmierung">Programmierung</h4></div>
<p>Das folgende Beispiel in der <a href="Programmiersprache" title="Programmiersprache">Programmiersprache</a> <a href="C-Sharp" title="C-Sharp">C#</a> zeigt die Implementierung des Algorithmus von Fleury für einen <a href="Ungerichteter_Graph" class="mw-redirect" title="Ungerichteter Graph">ungerichteten Graphen</a>. Der ungerichtete Graph wird als <a href="Klasse_(Objektorientierung)" title="Klasse (Objektorientierung)">Klasse</a> <i>UndirectedGraph</i> deklariert. Bei der Ausführung des Programms wird die <a href="Methode_(Programmierung)" title="Methode (Programmierung)">Methode</a> <i>Main</i> verwendet, die den Eulerkreis oder Eulerpfad auf der Konsole ausgibt.<sup id="cite_ref-:0_3-0" class="reference"><a href="#cite_note-:0-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
</p>
<table class="wikitable left mw-collapsible mw-collapsed font-size: 105.3%;">
<tbody><tr>
<td style="text-align:left; font-size: 95%;"><b>Code-Schnipsel</b>&nbsp;&nbsp;
</td></tr>
<tr>
<td>
<div class="mw-highlight mw-highlight-lang-c# mw-content-ltr" dir="ltr"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="nn">System.Collections.Generic</span><span class="p">;</span>

<span class="c1">// Deklariert die Klasse für die Knoten des Graphen</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Node</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">adjacentNodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="p">();</span><span class="w"> </span><span class="c1">// Menge der Nachbarknoten</span>
<span class="p">}</span>

<span class="c1">// Deklariert die Klasse für den ungerichteten Graphen</span>
<span class="k">class</span><span class="w"> </span><span class="nc">UndirectedGraph</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">nodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="p">();</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Diese Methode verbindet die Knoten node1 und node2 miteinander.</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">ConnectNodes</span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node2</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">node1</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">node2</span><span class="p">);</span>
<span class="w"> </span><span class="n">node2</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">node1</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Diese Methode trennt die Knoten node1 und node2 voneinander.</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">DisconnectNodes</span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node2</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">node1</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">node2</span><span class="p">);</span>
<span class="w"> </span><span class="n">node2</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">node1</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>

<span class="k">class</span><span class="w"> </span><span class="nc">Program</span>
<span class="p">{</span>
<span class="w"> </span><span class="c1">// Diese Methode gibt die Eulerpfad, die als Liste von Knoten übergeben wird, in der Form (A, B), (B, C), (C, D), ... als Text zurück.</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="nf">EulerPathToString</span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">nodeList</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">""</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">nodeList</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="c1">// for-Schleife, die die Knoten durchläuft</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">text</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="s">"("</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">nodeList</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="k">value</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">", "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">nodeList</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">].</span><span class="k">value</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">"), "</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">text</span><span class="p">.</span><span class="n">Substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">text</span><span class="p">.</span><span class="n">Length</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">text</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Diese Methode gibt die Liste der durchlaufenen Knoten zurück</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">GetEulerPathByFleury</span><span class="p">(</span><span class="n">UndirectedGraph</span><span class="w"> </span><span class="n">undirectedGraph</span><span class="p">,</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">startNode</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Behandelt den Fall, dass es zwei Knoten mit ungeradem Grad gibt und sucht einen Knoten mit ungeradem Grad</span>
<span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">nodes</span><span class="p">)</span><span class="w"> </span><span class="c1">// foreach-Schleife, die alle Knoten des Graphen durchläuft</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="c1">// Wenn der Grad des aktuellen Knoten ungerade ist</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">startNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">;</span><span class="w"> </span><span class="c1">// Knoten als Startknoten auswählen und foreach-Schleife verlassen</span>
<span class="w"> </span><span class="k">break</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">nodeList</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="p">();</span><span class="w"> </span><span class="c1">// Initialisiert die Liste der durchlaufenen Knoten</span>
<span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">nextNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="p">;</span><span class="w"> </span><span class="c1">// Referenz auf den jeweils nächsten Knoten der Eulerpfad, die gegebenenfalls nach dem vollständigen Durchlaufen der Kanten für den letzten Knoten (Zielknoten) benötigt wird.</span>
<span class="w"> </span><span class="n">AddNextEulerPathNode</span><span class="p">(</span><span class="n">undirectedGraph</span><span class="p">,</span><span class="w"> </span><span class="n">startNode</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">nextNode</span><span class="p">,</span><span class="w"> </span><span class="n">nodeList</span><span class="p">);</span><span class="w"> </span><span class="c1">// Aufruf der rekursiven Methode, die jeweils den nächsten Knoten hinzufügt</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">nextNode</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">nodeList</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">nextNode</span><span class="p">);</span><span class="w"> </span><span class="c1">// Wenn Referenz nicht null, Zielknoten hinzufügen</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">nodeList</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Rekursive Methode, die jeweils den nächsten Knoten hinzufügt</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">AddNextEulerPathNode</span><span class="p">(</span><span class="n">UndirectedGraph</span><span class="w"> </span><span class="n">undirectedGraph</span><span class="p">,</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">startNode</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">nextNode</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">nodeList</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">adjacentNodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="p">(</span><span class="n">startNode</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">);</span>
<span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">adjacentNodes</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">startNode</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">node</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">IsValidNextEdge</span><span class="p">(</span><span class="n">undirectedGraph</span><span class="p">,</span><span class="w"> </span><span class="n">startNode</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">))</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">nextNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">node</span><span class="p">;</span>
<span class="w"> </span><span class="n">nodeList</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">startNode</span><span class="p">);</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">DisconnectNodes</span><span class="p">(</span><span class="n">startNode</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">);</span>
<span class="w"> </span><span class="n">AddNextEulerPathNode</span><span class="p">(</span><span class="n">undirectedGraph</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">nextNode</span><span class="p">,</span><span class="w"> </span><span class="n">nodeList</span><span class="p">);</span><span class="w"> </span><span class="c1">// Rekursiver Aufruf der Methode</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Diese Methode prüft, ob sich mit der aktuellen Kante die Eulerpfad vervollständigen lässt</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">IsValidNextEdge</span><span class="p">(</span><span class="n">UndirectedGraph</span><span class="w"> </span><span class="n">undirectedGraph</span><span class="p">,</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node2</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">node1</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">node1</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">node2</span><span class="p">))</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">true</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">visitedNodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="p">();</span>
<span class="w"> </span><span class="n">DepthFirstSearch</span><span class="p">(</span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">visitedNodes</span><span class="p">);</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">visitedNodes</span><span class="p">.</span><span class="n">Count</span><span class="p">;</span>
<span class="w"> </span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">DisconnectNodes</span><span class="p">(</span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">node2</span><span class="p">);</span>
<span class="w"> </span>
<span class="w"> </span><span class="n">visitedNodes</span><span class="p">.</span><span class="n">Clear</span><span class="p">();</span>
<span class="w"> </span><span class="n">DepthFirstSearch</span><span class="p">(</span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">visitedNodes</span><span class="p">);</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">visitedNodes</span><span class="p">.</span><span class="n">Count</span><span class="p">;</span>
<span class="w"> </span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">node2</span><span class="p">);</span>
<span class="w"> </span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">count1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">count2</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Diese Methode verwendet Tiefensuche, um alle erreichbaren Knoten des Graphen zu durchlaufen</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">DepthFirstSearch</span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="n">startNode</span><span class="p">,</span><span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">visitedNodes</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">visitedNodes</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">startNode</span><span class="p">);</span><span class="w"> </span><span class="c1">// Fügt den aktuellen Knoten der Menge der markierten Knoten hinzu</span>
<span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="n">node</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">startNode</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">)</span><span class="w"> </span><span class="c1">// foreach-Schleife, die alle benachbarten Knoten des Knotens durchläuft</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">visitedNodes</span><span class="p">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">node</span><span class="p">))</span><span class="w"> </span><span class="c1">// Wenn der Knoten noch nicht markiert wurde</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">DepthFirstSearch</span><span class="p">(</span><span class="n">node</span><span class="p">,</span><span class="w"> </span><span class="n">visitedNodes</span><span class="p">);</span><span class="w"> </span><span class="c1">// Rekursiver Aufruf der Methode mit dem Nachbarknoten als Startknoten</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Hauptmethode, die das Programm ausführt</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Main</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Deklariert und initialisiert 5 Knoten</span>
<span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Node</span><span class="p">{</span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"A"</span><span class="p">};</span>
<span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Node</span><span class="p">{</span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"B"</span><span class="p">};</span>
<span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Node</span><span class="p">{</span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"C"</span><span class="p">};</span>
<span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node4</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Node</span><span class="p">{</span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"D"</span><span class="p">};</span>
<span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">node5</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Node</span><span class="p">{</span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"E"</span><span class="p">};</span>
<span class="w"> </span><span class="c1">// Deklariert und initialisiert ein Array mit den Knoten</span>
<span class="w"> </span><span class="n">Node</span><span class="p">[]</span><span class="w"> </span><span class="n">nodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">node2</span><span class="p">,</span><span class="w"> </span><span class="n">node3</span><span class="p">,</span><span class="w"> </span><span class="n">node4</span><span class="p">,</span><span class="w"> </span><span class="n">node5</span><span class="p">};</span>
<span class="w"> </span><span class="c1">// Erzeugt einen ungerichteten Graphen</span>
<span class="w"> </span><span class="n">UndirectedGraph</span><span class="w"> </span><span class="n">undirectedGraph</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">UndirectedGraph</span><span class="p">();</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">numberOfNodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">nodes</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">numberOfNodes</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="c1">// for-Schleife, die alle Knoten durchläuft</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">nodes</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span><span class="w"> </span><span class="c1">// Fügt die Knoten dem Graphen hinzu</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="c1">// Verbindet Knoten des Graphen miteinander</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node2</span><span class="p">,</span><span class="w"> </span><span class="n">node1</span><span class="p">);</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">node3</span><span class="p">);</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node3</span><span class="p">,</span><span class="w"> </span><span class="n">node2</span><span class="p">);</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node1</span><span class="p">,</span><span class="w"> </span><span class="n">node4</span><span class="p">);</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node4</span><span class="p">,</span><span class="w"> </span><span class="n">node5</span><span class="p">);</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node4</span><span class="p">,</span><span class="w"> </span><span class="n">node3</span><span class="p">);</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node4</span><span class="p">,</span><span class="w"> </span><span class="n">node2</span><span class="p">);</span>
<span class="w"> </span><span class="n">undirectedGraph</span><span class="p">.</span><span class="n">ConnectNodes</span><span class="p">(</span><span class="n">node3</span><span class="p">,</span><span class="w"> </span><span class="n">node5</span><span class="p">);</span>
<span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">&gt;</span><span class="w"> </span><span class="n">eulerPath</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GetEulerPathByFleury</span><span class="p">(</span><span class="n">undirectedGraph</span><span class="p">,</span><span class="w"> </span><span class="n">node1</span><span class="p">);</span><span class="w"> </span><span class="c1">// Aufruf der Methode, die die Liste der durchlaufenen Knoten zurückgibt</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">eulerPath</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">9</span><span class="p">)</span><span class="w"> </span><span class="c1">// Wenn die Anzahl der durchlaufenen Knoten um 1 größer als die Anzahl aller Kanten ist</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">eulerPathText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">EulerPathToString</span><span class="p">(</span><span class="n">eulerPath</span><span class="p">);</span><span class="w"> </span><span class="c1">// Aufruf der Methode</span>
<span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">eulerPathText</span><span class="p">);</span><span class="w"> </span><span class="c1">// Ausgabe auf der Konsole</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">"Es existiert kein Eulerpfad."</span><span class="p">);</span><span class="w"> </span><span class="c1">// Ausgabe auf der Konsole</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">ReadLine</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></tbody></table>
<p><b>Hinweise</b>: Sowohl für das <a href="Referenz_(Programmierung)" title="Referenz (Programmierung)">Referenzieren</a> der <a href="Knoten_(Graphentheorie)" title="Knoten (Graphentheorie)">Knoten</a> des <a href="Ungerichteter_Graph" class="mw-redirect" title="Ungerichteter Graph">ungerichteten Graphen</a> als auch für das Referenzieren der <a href="Nachbarknoten" class="mw-redirect" title="Nachbarknoten">Nachbarknoten</a> jedes Knoten wird ein <i>HashSet</i> (<a href="Menge_(Datenstruktur)" title="Menge (Datenstruktur)">Menge</a>) als <a href="Datentyp" title="Datentyp">Datentyp</a> verwendet und mit <a href="Foreach-Schleife" class="mw-redirect" title="Foreach-Schleife"><i>foreach</i>-Schleifen</a> durchlaufen. Der Vorteil des <i>HashSet</i> für die Nachbarknoten im Vergleich zu einer <a href="Liste_(Datenstruktur)" title="Liste (Datenstruktur)">Liste</a> ist, dass dann meist viel schneller, nämlich mit konstanter <a href="Laufzeit_(Informatik)" title="Laufzeit (Informatik)">Laufzeit</a>, geprüft werden kann, ob ein bestimmter Knoten Nachbarknoten eines anderen Knoten ist (siehe <a href="Hashtabelle#Vorteile_2" title="Hashtabelle">Hashtabelle – Vorteile</a>). Ein Nachteil ist, dass dann die <a href="Reihenfolge" title="Reihenfolge">Reihenfolge</a> der durchlaufenen Knoten in den <a href="Foreach-Schleife" class="mw-redirect" title="Foreach-Schleife"><i>foreach</i>-Schleifen</a> und damit auch die Reihenfolge der ausgegebenen Knoten des Eulerpfads nicht <a href="Eindeutigkeit" title="Eindeutigkeit">eindeutig</a> oder teilweise <a href="Zufall" title="Zufall">zufällig</a> ist.
</p><p>Im Programmbeispiel wird nur einer der möglichen Eulerpfade bestimmt und ausgegeben, falls einer existiert.
</p><p>Statt dem <i>HashSet</i> (<a href="Menge_(Datenstruktur)" title="Menge (Datenstruktur)">Menge</a>) <i>visitedNodes</i> kann auch eine <a href="Liste" title="Liste">Liste</a> oder ein <a href="Feld_(Datentyp)" class="mw-redirect" title="Feld (Datentyp)">Array</a> vom Typ <i>bool</i> (<a href="Boolesche_Variable" class="mw-redirect" title="Boolesche Variable">Boolesche Variable</a>) verwendet werden, wie im Einzelnachweis gezeigt.<sup id="cite_ref-:0_3-1" class="reference"><a href="#cite_note-:0-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Vermutung_von_Hajos">Vermutung von Hajos</h2></div>
<p>Nach der im Allgemeinen ungelösten Zyklenvermutung von <a href="Gy%C3%B6rgy_Haj%C3%B3s" title="György Hajós">György Hajós</a> über Kreiszerlegung von <a href="Eulergraph" class="mw-redirect" title="Eulergraph">Eulergraphen</a> von 1968 können Eulergraphen mit <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle n}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>n</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle n}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/a601995d55609f2d9f5e233e36fbe9ea26011b3b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.395ex; height:1.676ex;" alt="{\displaystyle n}" loading="lazy"></span> Knoten in höchstens <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {1}{2}}(n-1)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mn>2</mn>
</mfrac>
</mrow>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {1}{2}}(n-1)}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/736bdc8316a73a5999d5507534631be652a05e36.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -1.838ex; width:9.205ex; height:5.176ex;" alt="{\displaystyle {\frac {1}{2}}(n-1)}" loading="lazy"></span> Kreise zerlegt werden. Die Vermutung wurde für kleine Graphen (<span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle n\leq 12}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>n</mi>
<mo>≤<!-- ≤ --></mo>
<mn>12</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle n\leq 12}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/ced0c8199572399fda990e12bbbbc5192f3c0cae.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.505ex; width:6.818ex; height:2.343ex;" alt="{\displaystyle n\leq 12}" loading="lazy"></span>) 2017 bewiesen<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> und für <a href="Pfadweite" title="Pfadweite">Pfadweite</a> kleiner oder gleich 6.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Anwendungsbeispiele">Anwendungsbeispiele</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Das_Königsberger_Brückenproblem"><span id="Das_K.C3.B6nigsberger_Br.C3.BCckenproblem"></span>Das Königsberger Brückenproblem</h3></div>
<p>Das <a href="K%C3%B6nigsberger_Br%C3%BCckenproblem" title="Königsberger Brückenproblem">Königsberger Brückenproblem</a> lässt sich in folgendem Graphen ausdrücken:
</p>

<p>Die Kreise (<a href="Knoten_(Graphentheorie)" title="Knoten (Graphentheorie)">Knoten</a>) sind die jeweiligen Stadtteile bzw. Standpunkte. Die Linien (<a href="Kante_(Graphentheorie)" title="Kante (Graphentheorie)">Kanten</a>) sind die Brücken. Durch Probieren wird herausgefunden, dass es nicht möglich ist, einen Rundgang durch die Stadt zu finden, bei dem jede Brücke genau ein einziges Mal benutzt wird. Es gibt also keinen Eulerweg und demzufolge auch keinen Eulerkreis. Warum ist das so?
</p><p>Euler hat die folgende Gesetzmäßigkeit entdeckt: Wenn in einem Graphen <i>G</i> ein Eulerweg existiert, dann haben maximal 2 Knoten ungeraden Grad. Beim Königsberger Brückengraphen gibt es vier Knoten mit ungeradem Grad. Die Zahlen neben den Knoten geben in der Abbildung deren Grad an. Deshalb ist der Stadtrundgang mit dem nur einmaligen Benutzen jeder Brücke unmöglich.
</p><p>Ein ungerader Knoten ist entweder Anfang oder Ende des Weges über die Brücken: null ungerade Knoten würde bedeuten, dass Anfang und Ende des Weges in Königsberg identisch sind. Ein Weg mit Anfang und Ende hätte maximal zwei ungerade Knoten. Ergo ist es in Königsberg nicht möglich gewesen, alle Brücken in einem <i>Wege</i> nur jeweils einmal zu begehen.
</p>
<div class="mw-heading mw-heading3"><h3 id="Das_Haus_vom_Nikolaus">Das Haus vom Nikolaus</h3></div>
<div class="hauptartikel" role="navigation"><span class="hauptartikel-pfeil" title="siehe" aria-hidden="true" role="presentation">→&nbsp;</span><i><span class="hauptartikel-text">Hauptartikel</span>: <a href="Haus_vom_Nikolaus" title="Haus vom Nikolaus">Haus vom Nikolaus</a></i></div>
<p>Das beliebte Kinderrätsel „Das ist das Haus vom Nikolaus“ hingegen enthält einen Eulerweg, aber keinen Eulerkreis, da sein Graph zwei Knoten vom Grad 3 enthält.
</p><p><span class="mw-default-size skin-invert-image" typeof="mw:File"></span>
</p><p>Solch ein Eulerweg ist 1-2-4-3-1-4-5-3-2. Knoten 1 und 2 haben jeweils 3 Nachbarn, ihr Grad ist also <i>ungerade</i>. Um das Haus in einem Zug zeichnen zu können, muss daher an einem dieser beiden Punkte begonnen werden. Ein Quadrat mit Diagonalen enthält keinen Eulerweg, da alle seine Knoten den Grad 3 haben. Im Bild sind das nur die Punkte 1, 2, 3, 4 mit den verbindenden Kanten.
</p>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<div class="sisterproject" style="margin:0.1em 0 0 0;"><div class="noresize noviewer" style="display:inline-block; line-height:10px; min-width:1.6em; text-align:center;" aria-hidden="true" role="presentation"><span class="mw-default-size" typeof="mw:File"><span title="Commons"></span></span></div><b><span class=""><a class="external text" href="https://commons.wikimedia.org/wiki/Category:Eulerian_paths?uselang=de"><span lang="en">Commons</span>: Eulerkreisproblem</a></span></b>&nbsp;– Sammlung von Bildern, Videos und Audiodateien</div>
<ul><li><a href="Hamiltonkreisproblem" title="Hamiltonkreisproblem">Hamiltonkreisproblem</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Wladimir Velminski: <i>Leonhard Euler. Die Geburt der Graphentheorie</i>. Kulturverlag Kadmos, Berlin 2008, ISBN 978-3-86599-056-3.</li>
<li>Reinhard Diestel: <a rel="nofollow" class="external text" href="https://www.math.uni-hamburg.de/home/diestel/books/graphentheorie/"><i>Graphentheorie.</i></a> 3. Auflage. Springer, 2006, ISBN 3-540-21391-0, S. 23–24</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Brian Hopkins, Robin J. Wilson: <cite style="font-style:italic">The Truth about Königsberg</cite>. In: <cite style="font-style:italic">The College Mathematics Journal</cite>. <span style="white-space:nowrap">Band<span style="display:inline-block;width:.2em">&nbsp;</span>35</span>, <span style="white-space:nowrap">Nr.<span style="display:inline-block;width:.2em">&nbsp;</span>3</span>, 2004, <span style="white-space:nowrap">Paragraphen 20 und 21</span>, <a href="Digital_Object_Identifier" title="Digital Object Identifier">doi</a>:<span class="uri-handle" style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://doi.org/10.1080/07468342.2004.11922073">10.1080/07468342.2004.11922073</a></span>.<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rfr_id=info:sid/de.wikipedia.org:Eulerkreisproblem&amp;rft.atitle=The+Truth+about+K%C3%B6nigsberg&amp;rft.au=Brian+Hopkins%2C+Robin+J.+Wilson&amp;rft.date=2004&amp;rft.doi=10.1080%2F07468342.2004.11922073&amp;rft.genre=journal&amp;rft.issue=3&amp;rft.jtitle=The+College+Mathematics+Journal&amp;rft.volume=35" style="display:none">&nbsp;</span></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text">Hierholzer <i>Über die Möglichkeit, einen Linienzug ohne Wiederholung und ohne Unterbrechung zu umfahren</i>, Mathematische Annalen, Bd. 6, 1873, S. 30–32, <a rel="nofollow" class="external text" href="https://zenodo.org/record/1447429/files/article.pdf">Online</a></span>
</li>
<li id="cite_note-:0-3"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-:0_3-0">a</a></sup> <sup><a href="#cite_ref-:0_3-1">b</a></sup></span> <span class="reference-text">GeeksforGeeks: <a rel="nofollow" class="external text" href="https://www.geeksforgeeks.org/fleurys-algorithm-for-printing-eulerian-path/">Fleury’s Algorithm for printing Eulerian Path or Circuit</a></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://arxiv.org/abs/1705.08724">Irene Heinrich, Marco Natale, Manuel Streicher, Hajós' cycle conjecture for small graphs</a>, Arxiv 2017</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://arxiv.org/abs/1705.07066">Elke Fuchs, Laura Gellert, Irene Heinrich: Cycle decompositions of pathwidth-6 graphs</a>, Arxiv 2017</span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-12-14" href="https://de.wikipedia.org/wiki/?title=Eulerkreisproblem&amp;oldid=262422070">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>